列表推导
1. 简介
列表推导(List Comprehension)是 Haskell 中一种强大且简洁的语法,用于生成列表。它类似于数学中的集合推导,允许你通过简洁的语法生成新的列表。列表推导不仅易于理解,而且在处理列表时非常高效。
2. 基本语法
列表推导的基本语法如下:
[ expression | generator, predicate ]
expression:生成列表中每个元素的表达式。generator:定义了如何生成元素的生成器。predicate:可选的条件,用于过滤生成的元素。
2.1 生成器
生成器用于生成列表中的元素。常见的生成器形式是 variable <- list,其中 variable 是生成的变量,list 是源列表。
[ x | x <- [1..5] ]
这个表达式会生成一个包含 [1, 2, 3, 4, 5] 的列表。
2.2 条件(谓词)
条件用于过滤生成的元素。只有满足条件的元素才会被包含在最终的列表中。
[ x | x <- [1..10], x `mod` 2 == 0 ]
这个表达式会生成一个包含 [2, 4, 6, 8, 10] 的列表,因为只有偶数满足条件。
3. 示例
3.1 生成平方数列表
squares = [ x^2 | x <- [1..10] ]
这个表达式会生成一个包含 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 的列表。
3.2 生成偶数平方列表
evenSquares = [ x^2 | x <- [1..10], x `mod` 2 == 0 ]
这个表达式会生成一个包含 [4, 16, 36, 64, 100] 的列表。
3.3 生成笛卡尔积
cartesianProduct = [ (x, y) | x <- [1, 2, 3], y <- ['a', 'b'] ]
这个表达式会生成一个包含 [(1,'a'), (1,'b'), (2,'a'), (2,'b'), (3,'a'), (3,'b')] 的列表。
4. 实践练习
4.1 练习1:生成斐波那契数列
编写一个列表推导语句,生成前 10 个斐波那契数列。
fibs = [ fib | n <- [0..9], let fib = if n <= 1 then n else fibs !! (n-1) + fibs !! (n-2) ]
4.2 练习2:生成素数列表
编写一个列表推导语句,生成前 20 个素数。
primes = [ x | x <- [2..], all (\p -> x `mod` p /= 0) [2..x-1] ]
4.3 练习3:生成字符串列表
编写一个列表推导语句,生成一个包含所有小写字母的字符串列表。
lowercaseLetters = [ [chr x] | x <- [97..122] ]
5. 总结
列表推导是 Haskell 中一种非常强大的工具,能够以简洁的方式生成和处理列表。通过掌握列表推导的基本语法和应用场景,你可以在编写 Haskell 代码时更加高效和优雅。
6. 进阶阅读
通过这些资源,你可以进一步深入了解列表推导的高级用法和更多实际应用场景。